﻿using System;
using Tibet.Datos.Interfaces;
using Tibet.Entidades;
using System.Data.SqlClient;
using Tibet.Datos.FabricaDatos;

namespace Tibet.Datos.DaosSqlServer
{
    public  class DaoSqlServerAccesoCredencial:IDaoAccesoCredencial
    {
        IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();

        public DaoSqlServerAccesoCredencial()
        { 

        }

        /// <summary>
        /// Inserta una nueva credencial en la base de datos
        /// </summary>
        /// <param name="credencial">Credencial a insertar</param>
        /// <returns>Si la inserción fue exitosa o no</returns>
        public bool CrearCredencial( Credencial credencial )
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSCredencial]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue( "@NombreUsuario",
                    credencial.NombreUsuario );
                command.Parameters.AddWithValue( "@Contrasenha",
                    credencial.Contrasenha );
                command.Parameters.AddWithValue( "@Status",
                    credencial.Status );

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();

                return true;
            } catch ( SqlException )
            {
                bd.CerrarConexionBd();
                return false;
            } catch ( Exception )
            {
                bd.CerrarConexionBd();
                return false;
            }
        }

        /// <summary>
        /// Modifica la credencial recibida como parámetro
        /// </summary>
        /// <param name="credencial">Credencial a modificar</param>
        /// <returns>Si la modificación fue exitosa o no</returns>
        public bool ModificarCredencial( Credencial credencial )
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UPDCredencial]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue( "@NombreUsuario",
                    credencial.NombreUsuario );
                command.Parameters.AddWithValue( "@Contrasenha",
                    credencial.Contrasenha );

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;
            } catch ( SqlException )
            {
                bd.CerrarConexionBd();
                return false;
            } catch ( Exception )
            {
                bd.CerrarConexionBd();
                return false;
            }
        }

        /// <summary>
        /// Verifica si existe la credencial en la base de datos
        /// </summary>
        /// <param name="credencial">Credencial a buscar</param>
        /// <returns>Si la credencial existe o no</returns>
        public bool ExisteCredencial( Credencial credencial )
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELCredencial]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue( "@NombreUsuario",
                    credencial.NombreUsuario );
                command.Parameters.AddWithValue( "@ClaveUsuario",
                    credencial.Contrasenha );

                SqlDataReader reader = command.ExecuteReader();

                if ( reader.Read() )
                {

                    return true;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return false;
            } catch ( SqlException )
            {
                bd.CerrarConexionBd();
                return false;
            } catch ( Exception )
            {
                bd.CerrarConexionBd();
                return false;
            }
        }


        /// <summary>
        /// Metodo que verifica el usuario y la clave por medio de la direccion
        /// email
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>

        public Credencial BuscarUsuarioClave(String email)
        {
            string usuario, clave;

            SqlCommand command = new SqlCommand();

            try
            {


                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELUsuarioClave]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@email", email);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    usuario = reader[0].ToString();
                    clave = reader[1].ToString();
                    Credencial credencial = new Credencial(usuario, clave);
                    return (credencial);
                }



            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();

            }


            return null;
        }

        #region Integracion SVN
        /// <summary>
        /// Devuelve el id correspondiente de la base de datos del usuario registrado en el SVN
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int FuncConsultarIdUsuario(string usuario)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELidUsuario.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@usernameUsuario", usuario);
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    int strUsuario = Convert.ToUInt16(reader.GetValue(0));
                    return strUsuario;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return 0;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }
        #endregion


        

    }




}
